package GUI; import java.awt.Color; import java.awt.Image; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.Iterator; import java.util.Map; import java.util.Set; import java.util.Map.Entry; import javax.swing.ButtonGroup; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JRadioButton; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.table.DefaultTableModel; import Entities.Account; import Entities.Bank; import Entities.Person; import Entities.SavingAccount; import Entities.SpendingAccount; import Helper.Serialization; import Helper.UserInputChecker; public class Frame extends JFrame implements ActionListener { private static final long serialVersionUID = 1L; JFrame f = new JFrame(); private JTable table; private JRadioButton userButton, managerButton; private ButtonGroup group; boolean user, manager; private JButton btnAddAccount, btnDeleteAccount, btnDeletePerson, findAllPersons; private JButton btnDeposit, btnWithdraw, btnSold, saveBank, findAllAccounts; private JTextField textName, textEmail, textPhone, textId, textMoney; private JLabel lblName, lblEmail, lblPhone, lblId, lblMoney, bankLabel; private DefaultTableModel model; UserInputChecker checkInput; Bank bank; Serialization ser; JScrollPane scrollPane; public Frame() { super("Bank"); ser = new Serialization(); try { bank = ser.DeserializeBank(); } catch (ClassNotFoundException e) { e.printStackTrace(); } checkInput = new UserInputChecker(); table = new JTable(); Object[] columns = { "Name", "Email", "Phone", "Id", "Money" }; model = new DefaultTableModel(); model.setColumnIdentifiers(columns); table.setModel(model); table.setBackground(Color.lightGray); table.setForeground(Color.GRAY); table.setRowHeight(30); JScrollPane pane = new JScrollPane(table); pane.setBounds(0, 0, 880, 200); btnAddAccount = new JButton("Add account"); btnDeleteAccount = new JButton("Delete account"); btnDeletePerson = new JButton("Delete person"); btnAddAccount.addActionListener(this); btnDeletePerson.addActionListener(this); btnDeleteAccount.addActionListener(this); btnAddAccount.setBounds(250, 220, 120, 25); btnDeletePerson.setBounds(250, 260, 120, 25); btnDeleteAccount.setBounds(250, 300, 120, 25); textName = new JTextField(); textEmail = new JTextField(); textPhone = new JTextField(); textId = new JTextField(); textMoney = new JTextField(); textName.setBounds(50, 220, 100, 25); textEmail.setBounds(50, 250, 100, 25); textPhone.setBounds(50, 280, 100, 25); textId.setBounds(50, 310, 100, 25); textMoney.setBounds(50, 340, 100, 25); findAllPersons = new JButton("Find all persons"); findAllPersons.addActionListener(this); findAllPersons.setBounds(250, 340, 125, 25); findAllAccounts = new JButton("Find all accounts"); findAllAccounts.addActionListener(this); findAllAccounts.setBounds(250, 380, 130, 25); saveBank = new JButton("Save bank"); saveBank.addActionListener(this); saveBank.setBounds(450, 380, 100, 25); btnDeposit = new JButton("Deposit Money"); btnWithdraw = new JButton("Withdraw Money"); btnSold = new JButton("Sold balance"); btnDeposit.addActionListener(this); btnWithdraw.addActionListener(this); btnSold.addActionListener(this); btnDeposit.setBounds(620, 300, 200, 25); btnWithdraw.setBounds(620, 340, 200, 25); btnSold.setBounds(620, 380, 200, 25); lblName = new JLabel("Name "); lblName.setBounds(10, 220, 100, 25); lblEmail = new JLabel("Email "); lblEmail.setBounds(10, 250, 100, 25); lblPhone = new JLabel("Phone "); lblPhone.setBounds(10, 280, 100, 25); lblId = new JLabel("PIN "); lblId.setBounds(10, 310, 100, 25); lblMoney = new JLabel("Money"); lblMoney.setBounds(10, 340, 100, 25); ImageIcon iconBank = new ImageIcon("Resources/bank.jpg"); Image takeImage = iconBank.getImage(); Image resizedImg = takeImage.getScaledInstance(130, 130, java.awt.Image.SCALE_SMOOTH); ImageIcon newImage = new ImageIcon(resizedImg); bankLabel = new JLabel(); bankLabel.setBounds(432, 200, 350, 200); bankLabel.setIcon(newImage); setLayout(null); add(bankLabel); add(lblName); add(lblEmail); add(lblPhone); add(lblId); add(lblMoney); add(btnSold); add(btnDeposit); add(btnWithdraw); add(pane); add(textName); add(textEmail); add(textPhone); add(textId); add(textMoney); add(btnAddAccount); add(btnDeletePerson); add(btnDeleteAccount); add(findAllPersons); add(findAllAccounts); add(saveBank); userButton = new JRadioButton("Account Holder"); userButton.addActionListener(this); userButton.setBounds(650, 200, 120, 30); getContentPane().add(userButton); managerButton = new JRadioButton("Bank Manager"); managerButton.addActionListener(this); managerButton.setBounds(650, 230, 120, 30); getContentPane().add(managerButton); group = new ButtonGroup(); user = false; manager = false; group.add(userButton); group.add(managerButton); setVisible(true); setSize(900, 470); setDefaultCloseOperation(EXIT_ON_CLOSE); setLocationRelativeTo(null); table.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent event) { int i = table.getSelectedRow(); textName.setText(model.getValueAt(i, 0).toString()); textEmail.setText(model.getValueAt(i, 1).toString()); textPhone.setText(model.getValueAt(i, 2).toString()); textId.setText(model.getValueAt(i, 3).toString()); textMoney.setText(model.getValueAt(i, 4).toString()); } }); } @Override public void actionPerformed(ActionEvent event) { Object c = (Object) event.getSource(); if (c == userButton) { user = true; manager = false; } if (c == managerButton) { user = false; manager = true; } // for account holder if (user == true) { btnAddAccount.setEnabled(false); btnDeleteAccount.setEnabled(false); btnDeletePerson.setEnabled(false); findAllPersons.setEnabled(false); findAllAccounts.setEnabled(false); saveBank.setEnabled(false); btnDeposit.setEnabled(true); btnWithdraw.setEnabled(true); btnSold.setEnabled(true); // for bank manager } else if (manager == true) { btnDeposit.setEnabled(false); btnWithdraw.setEnabled(false); btnSold.setEnabled(false); btnAddAccount.setEnabled(true); btnDeleteAccount.setEnabled(true); btnDeletePerson.setEnabled(true); findAllPersons.setEnabled(true); findAllAccounts.setEnabled(true); saveBank.setEnabled(true); } /** * Deposit money to SPENDING or SAVING account */ if (event.getSource() == btnDeposit) { String name = checkInput.checkString(textName); String email = checkInput.checkString(textEmail); String phone = checkInput.checkString(textPhone); int pin = checkInput.checkNumber(textId); int sum = checkInput.checkNumber(textMoney); if (name != null && email != null && phone != null && pin != 0 && sum != 0) { Person p = new Person(name, email, phone); if (sum > 0){ bank.depositMoney(sum, pin, p); JOptionPane.showMessageDialog(this, "The sum " + sum + " was successfully added to your account!"); } else JOptionPane.showMessageDialog(this, "Sum to be deposit must be greater than 0!"); } else JOptionPane.showMessageDialog(this, "Please enter valid data!"); textMoney.setText(" "); } /** * Withdraw money from a certain account */ else if (event.getSource() == btnWithdraw) { String name = checkInput.checkString(textName); String email = checkInput.checkString(textEmail); String phone = checkInput.checkString(textPhone); int pin = checkInput.checkNumber(textId); int sum = checkInput.checkNumber(textMoney); if (name != null && email != null && phone != null && pin != 0 && sum != 0) { Person p = new Person(name, email, phone); if (sum > 0){ bank.withdrawMoney(sum, pin, p); // JOptionPane.showMessageDialog(this, "The sum " + sum + " was successfully withdrawn from your account!"); } else JOptionPane.showMessageDialog(this, "Sum to be withdrawn must be greater than 0!"); } else JOptionPane.showMessageDialog(this, "Please enter valid data!"); textMoney.setText(" "); } /** * Sold balance */ else if (event.getSource() == btnSold) { String name = checkInput.checkString(textName); String email = checkInput.checkString(textEmail); String phone = checkInput.checkString(textPhone); int pin = checkInput.checkNumber(textId); if (name != null && email != null && phone != null && pin != 0) { Person p = new Person(name, email, phone); double sold = bank.findAccount(pin, p); JOptionPane.showMessageDialog(this, "Your sold is: " + sold); } } /** * Add a new account for a person */ else if (event.getSource() == btnAddAccount) { String name = checkInput.checkString(textName); String email = checkInput.checkString(textEmail); String phone = checkInput.checkString(textPhone); int pin = checkInput.checkNumber(textId); int sum = checkInput.checkNumber(textMoney); if (name != null && email != null && phone != null && pin != 0 && sum != 0) { String choice = JOptionPane.showInputDialog(this, "Please enter: 1 for spending account or 2 for saving account "); Person p = new Person(name, email, phone); if (choice.equals("1")) { Account acc = new SpendingAccount(pin, sum); bank.addAccForPerson(p, acc); JOptionPane.showMessageDialog(this, "New spending account added for: " + p.toString()); } else if (choice.equals("2")) { Account acc = new SavingAccount(pin, sum); bank.addAccForPerson(p, acc); JOptionPane.showMessageDialog(this, "New saving account added for: " + p.toString()); } else { JOptionPane.showMessageDialog(this, "Please enter valid data!"); } refresh(); Object[] row1 = { name, email, phone, pin, sum }; model.addRow(row1); } else JOptionPane.showMessageDialog(this, "Please enter valid data!"); } /** * Delete a person from bank + all corresponding accounts */ else if (event.getSource() == btnDeletePerson) { String name = checkInput.checkString(textName); String email = checkInput.checkString(textEmail); String phone = checkInput.checkString(textPhone); if (name != null && email != null && phone != null) { Person p = new Person(name, email, phone); bank.deletePerson(p); } else { JOptionPane.showMessageDialog(this, "Please enter valid data!"); } refresh(); int i = table.getSelectedRow(); if (i >= 0) { model.removeRow(i); refresh(); } else { System.out.println("Delete error"); } } /** * Delete an account */ else if (event.getSource() == btnDeleteAccount) { String name = checkInput.checkString(textName); String email = checkInput.checkString(textEmail); String phone = checkInput.checkString(textPhone); int pin = checkInput.checkNumber(textId); if (name != null && email != null && phone != null && pin != 0) { Person p = new Person(name, email, phone); bank.deleteAccount(pin, p); } refresh(); } /** * Find all account in the bank */ else if (event.getSource() == findAllAccounts) { Bank newBank = new Bank(); try { newBank = ser.DeserializeBank(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } Set<Account> allAccounts = newBank.findAllAccounts(); for (Account acc : allAccounts) { System.out.println(acc.toString()); String id = Integer.toString(acc.getAccId()); String money = Double.toString(acc.getMoney()); Object[] row = { "", "", "", id, money }; model.addRow(row); } Object[] row1 = { "", "", "", "", "" }; model.addRow(row1); } /** * Find all persons which have accounts + their accounts */ else if (event.getSource() == findAllPersons) { Bank newBank = new Bank(); try { newBank = ser.DeserializeBank(); } catch (ClassNotFoundException e) { e.printStackTrace(); } Iterator<Entry<Person, Set<Account>>> it = newBank.getList().entrySet().iterator(); while (it.hasNext()) { Map.Entry<Person, Set<Account>> pair = it.next(); Person p = pair.getKey(); String name = p.getName(); String email = p.getEmail(); String phone = p.getPhone(); Set<Account> accForOnePerson = pair.getValue(); for (Account acc : accForOnePerson) { String pin = Integer.toString(acc.getAccId()); String money = Double.toString(acc.getMoney()); Object[] row = { name, email, phone, pin, money }; model.addRow(row); } } Object[] emptyRow = { "", "", "", "", "" }; model.addRow(emptyRow); } /** * Save the current state of the bank in a file using serialization * */ else if (event.getSource() == saveBank) { ser.SerializeBank(bank); } } public void changeRows() { Object[] row = new Object[5]; row[0] = textName.getText(); row[1] = textEmail.getText(); row[2] = textPhone.getText(); row[3] = textId.getText(); row[4] = textMoney.getText(); model.addRow(row); } public void refresh() { textName.setText(" "); textEmail.setText(" "); textPhone.setText(" "); textId.setText(" "); textMoney.setText(" "); } }